﻿#ifndef  SESSION_H
#define  SESSION_H

#include "tftp.h"

#include <QString>
#include <QMap>

class QIODevice;

namespace TFTP {

/**
* @brief TFTP传输基类
*
*   此类是所有TFTP传输类的父类
*   ServerWriteSession
*   ServerReadSession
*   ClientWriteSession
*   ClientReadSession
* @warning 确保连接客户端和服务器的sentFile和receivedFile插槽，
*   因为此类不再关闭设备！
*/
class Session{
public:
    virtual ~Session();
    void closeDevice();

protected:
    Session(TransferInfo T) : ti(T) {}

    TransferInfo    ti;                     ///< 传输对等信息
    TransferMode    currentMode;            ///< 当前传输的传输模式（不传输时应无效）
    quint16         currentBlock;           ///< 当前块的索引（最后一个已确认）
    QString         m_currentFilename;      ///< 当前客户端由提供文件名 （未重新映射）
    QIODevice       *m_currentFile;         ///< 指向QFile（或QBuffer）实例的指针表示当前正在读取或写入的文件
public:
    // 获取当前的TransferInfo
    inline const TransferInfo transferInfo() const
    { return ti; }

    //  获取当前设备
    inline QIODevice *currentFile() const
    { return m_currentFile; }

    //  获取远程文件名
    inline QString currentFilename() const
    { return m_currentFilename; }

    struct FileMappingItem {
        QIODevice *dev;	///< 要将文件保存到的设备（例如，可以是QBuffer）
        bool oneshot;	///< 如果为true，则应在传输一个文件后删除映射
    };

};

};

#endif
